package org.bai.algorithm.hot.medium;

/**
 * 两数相加
 * 给你两个 非空 的链表，表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的，并且每个节点只能存储 一位 数字。
 */

import org.bai.algorithm.entity.ListNode;
import org.bai.algorithm.util.ListNodeUtil;
import org.bai.algorithm.util.RevealUtil;

/**
 * 2 -> 4 -> 3  // 342
 * 5 -> 6 -> 4  // 465
 *
 * 7 -> 0 -> 8  // 807
 *
 */
public class AddTwoNumbers {

    public static void main(String[] args) {
        ListNode<Integer> l1 = ListNodeUtil.buildInt(17, 10);
        ListNode<Integer> l2 = ListNodeUtil.buildInt(20, 10);
        RevealUtil.reveal(l1);
        RevealUtil.reveal(l2);
        RevealUtil.reveal(addTwoNumbers(l1, l2));
    }

    public static ListNode<Integer> addTwoNumbers(ListNode<Integer> l1, ListNode<Integer> l2) {
        ListNode<Integer> target = new ListNode<>(0);
        ListNode<Integer> temporary = target;

        int carry = 0;
        do{
            int v1 = (null != l1 && null != l1.val) ?  l1.val : 0;
            int v2 = (null != l2 && null != l2.val) ?  l2.val : 0;

            int add = v1 + v2 + carry;
            temporary.val = (add % 10);
            carry = add /10;

            temporary = temporary.buildNext();
            l1 = null == l1 ? l1 : l1.next;
            l2 = null == l2 ? l2 : l2.next;
        } while (null != l1 || null != l2);

        if (carry == 1) {
            temporary.val = 1;
        }

        return target;
    }
}

